package lanqiao._02算法训练.page02;

import java.util.Scanner;

/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec 问题描述
 * 　　逗志芃又一次面临了危机。逗志芃的妹子是个聪明绝顶的人，相比之下逗志芃就很菜了。
 * 现在她妹子要和他玩一个游戏，这个游戏是这样的：一共有n个数（n是偶数）写成一行，
 * 然后两个人轮流取数，每次只能从最前面或者最后面取走一个数，全部取完则游戏结束，
 * 之后每个人取走的数的和就是每个人的得分。由于逗志芃妹子很厉害，但他又不想输，
 * 所以只能找到你了，你要告诉他最多可以得到多少分。
 * （注意，妹子智商是maxlongint所以是不会犯错的，每次的策略必然最优，而且逗志芃是先手）
 * 输入格式
 * 　　第一行一个数n，表示有n个数。
 * 　　第二行就是进行游戏的n个数。
 * 输出格式
 * 　　一个数，最高得分
 * 样例输入
 * 2
 * 10 20
 * 样例输出
 * 20
 * 数据规模和约定
 * 　　例：0<n,m<=1000,每个数不超过10000 。
 * @since 2022 - 11 - 06 - 21:48
 */
public class _16逗志芃的危机 {

}

class Main16 {
    // f[i][j]表示从i到j的最大得分
    static int[][] dp;
    static int[] nums;
    //前缀和
    static int[] sums;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        nums = new int[n];
        dp = new int[n][n];
        sums = new int[n + 1];
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
            sums[i + 1] = sums[i] + nums[i];
        }

        //枚举 区间 长度
        for (int len = 1; len <= n; len++) {
            for (int l = 0; l + len - 1 < n; l++) {
                int r = l + len - 1;
                if (l == r) { //只有一个数，我们先手取
                    dp[l][r] = nums[l];
                    continue;
                }
                //区域长度总和减去最小的，就剩下最大的
                int total = sums[r + 1] - sums[l];
                //对方取最少，我们就得到最大
                dp[l][r] = total - Math.min(dp[l + 1][r], dp[l][r - 1]);
            }
        }
        System.out.println(dp[0][n - 1]);
    }
}

class Main16_1 {
    static int N = 1010;
    static int[] a = new int[N];
    static int[][] res = new int[N][N];
    static int n;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        for (int i = 0; i < n; i++) a[i] = sc.nextInt();
        for (int r = 0; r < n; r++) {
            for (int l = r; l >= 0; l--) {
                if (l == r) res[l][r] = 0;
                else if ((r - l + 1) % 2 == 0) {
                    //偶数个
                    res[l][r] = Math.max(a[l] + res[l + 1][r], a[r] + res[l][r - 1]);
                } else {
                    res[l][r] = Math.min(res[l + 1][r], res[l][r - 1]);
                }
            }
        }
        System.out.println(res[0][n - 1]);
    }
}